﻿#ifndef SINGLETON_H
#define SINGLETON_H

#include <iostream>
#include <memory>
#include <mutex>


/**
 * 线程安全：
 *
 * 利用 C++11 标准保证局部静态变量初始化的线程安全性，无需手动加锁。
 * 高效性：
 *
 * 只有在第一次调用 getInstance() 时才会创建实例，避免了不必要的开销。
 * 简单性：
 *
 * 无需额外的同步代码，代码更简洁、可维护。
 * 自动销毁：
 *
 * 自动管理生命周期，无需手动释放 SingletonStatic 实例。
 *
 * C++11 局部静态变量初始化已经是线程安全的，双重检查锁定主要是为了兼容性和学习目的。
 * 实际使用中，优先考虑局部静态变量方式。
 */


// 模板化的线程安全 SingletonStatic
template <typename T>
class SingletonStatic
{
public:
    SingletonStatic(const SingletonStatic&) = delete;
    void operator=(const SingletonStatic&) = delete;

protected:
    SingletonStatic() = default;
    ~SingletonStatic() = default;

public:
    static T& instance()
    {
        static T instance_; // C++11 局部静态变量，线程安全
        return instance_;
    }
};


template <typename T>
class Singleton
{
public:
    Singleton(const Singleton&) = delete;
    void operator=(const Singleton&) = delete;

protected:
    Singleton() = default;
    ~Singleton() = default;

public:
    static T* instance()
    {
        if (!instance_)
        {
            std::lock_guard<std::mutex> lock(mutex_);
            if (!instance_)
            {
                instance_ = new T();
            }
        }

        return instance_;
    }

private:
    static T* instance_;
    static std::mutex mutex_;
};

template <typename T>
T* Singleton<T>::instance_ = nullptr;

template <typename T>
std::mutex Singleton<T>::mutex_;

#endif // SINGLETON_H
